package com.xc.xcrpc.serializer;

import com.xc.xcrpc.spi.SpiLoader;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * 序列化器工厂（用于获取序列化器对象）
 *
 * @author <a href="https://github.com/liyupi">程序员鱼皮</a>
 * @learn <a href="https://codefather.cn">编程宝典</a>
 * @from <a href="https://yupi.icu">编程导航知识星球</a>
 */
@Slf4j
public class SerializerFactory {


    /**
     * 24/9/23
     * 这里有个问题 为什么provider调用getInstance会执行这个static 而consumer调用这个getInstance不会执行这个，是因为这个static的执行顺序吗 在provider时就加载了
     * 那我直接启动 consumer也不会加载这个 方法啊
     *
     * 在 Java 中，静态代码块只会在类被加载时执行一次。
     * 如果在 provider 调用SerializerFactory.getInstance()时执行了静态代码块，可能是因为在 provider 的执行路径中，某个操作触发了SerializerFactory类的加载。
     * 而在 consumer 调用getInstance()时没有执行静态代码块，可能是因为在 consumer 的执行路径中，SerializerFactory类已经被加载过了（可能是在 provider 加载时就加载了），
     * 所以不会再次执行静态代码块。
     * 这确实与类的加载顺序有关。如果在 provider 执行过程中加载了SerializerFactory类，并且执行了静态代码块，那么后续如果 consumer 也使用这个类，
     * 但如果类已经被加载过，静态代码块就不会再次执行。
     * 如果直接启动 consumer，且在启动 consumer 的过程中没有触发SerializerFactory类的加载操作，那么静态代码块也不会执行。
     * 要确保 consumer 也能加载并执行静态代码块，可以考虑在 consumer 的启动逻辑中明确地触发对SerializerFactory类的引用，
     * 或者通过其他方式确保该类在 consumer 启动时被加载。但这种方式可能会引入不必要的复杂性，需要根据具体的应用场景谨慎考虑。
     *
     *
     */
    static {
        log.info("加载spiLoader");
        SpiLoader.load(Serializer.class);
        log.info("加载完成spiLoader");
    }

    /**
     * 默认序列化器
     */
    private static final Serializer DEFAULT_SERIALIZER = new JdkSerializer();

    /**
     * 获取实例
     *
     * @param key
     * @return
     */
    public static Serializer getInstance(String key) {
        return SpiLoader.getInstance(Serializer.class, key);
    }

}
